package com.github.axet.audiorecorder.simple.recorder

import android.content.Context
import android.content.SharedPreferences
import android.preference.PreferenceManager
import com.github.axet.audiorecorder.simple.app.RecordingConfig
import com.github.axet.audiorecorder.simple.app.SimpleStorage
import com.github.axet.audiorecorder.simple.services.SimpleRecordingService

/**
 * 简单录音管理器 - 可以在其他应用中使用的独立录音功能
 * 
 * 使用示例：
 * val manager = SimpleRecordingManager(context)
 * manager.startRecording()
 * manager.stopRecording()
 */
class SimpleRecordingManager(context: Context) {
    
    private val context: Context = context.applicationContext
    private val storage: SimpleStorage = SimpleStorage(this.context)
    private var config: RecordingConfig
    
    init {
        initializeConfig()
        config = RecordingConfig.fromPreferences(this.context)
    }
    
    /**
     * 初始化默认配置
     */
    private fun initializeConfig() {
        val prefs = PreferenceManager.getDefaultSharedPreferences(context)
        val editor = prefs.edit()
        
        // 只在首次使用时设置默认值
        if (!prefs.contains(RecordingConfig.PREF_SAMPLE_RATE)) {
            editor.putInt(RecordingConfig.PREF_SAMPLE_RATE, RecordingConfig.DEFAULT_SAMPLE_RATE)
        }
        if (!prefs.contains(RecordingConfig.PREF_AUDIO_FORMAT)) {
            editor.putString(RecordingConfig.PREF_AUDIO_FORMAT, RecordingConfig.DEFAULT_AUDIO_FORMAT)
        }
        if (!prefs.contains(RecordingConfig.PREF_AUDIO_SOURCE)) {
            editor.putInt(RecordingConfig.PREF_AUDIO_SOURCE, RecordingConfig.getDefaultAudioSource())
        }
        if (!prefs.contains(RecordingConfig.PREF_RETENTION_DAYS)) {
            editor.putInt(RecordingConfig.PREF_RETENTION_DAYS, RecordingConfig.DEFAULT_RETENTION_DAYS)
        }
        
        editor.apply()
    }
    
    /**
     * 开始录音
     */
    fun startRecording() {
        SimpleRecordingService.startRecording(context)
    }
    
    /**
     * 停止录音
     */
    fun stopRecording() {
        SimpleRecordingService.stopRecording(context)
    }
    
    /**
     * 获取当前录音配置
     */
    fun getConfig(): RecordingConfig {
        return RecordingConfig.fromPreferences(context)
    }
    
    /**
     * 更新录音配置
     */
    fun updateConfig(newConfig: RecordingConfig) {
        newConfig.saveToPreferences(context)
        config = newConfig
    }
    
    /**
     * 获取存储管理器
     */
    fun getStorage(): SimpleStorage {
        return storage
    }
    
    /**
     * 获取配置信息的显示文本
     */
    fun getConfigDisplayText(): String {
        val currentConfig = getConfig()
        return "${currentConfig.getAudioSourceName()} | ${currentConfig.getSampleRateText()} | ${currentConfig.getAudioFormatText()}"
    }
    
    /**
     * 设置录音保留天数
     */
    fun setRetentionDays(days: Int) {
        val currentConfig = getConfig()
        currentConfig.retentionDays = if (RecordingConfig.isValidRetentionDays(days)) days else RecordingConfig.DEFAULT_RETENTION_DAYS
        updateConfig(currentConfig)
    }
    
    /**
     * 获取当前录音保留天数
     */
    fun getRetentionDays(): Int {
        return getConfig().retentionDays
    }
    
    /**
     * 手动触发清理旧录音
     */
    fun cleanupOldRecordings() {
        storage.cleanupOldRecordings()
    }
    
    companion object {
        /**
         * 创建自定义配置的录音管理器
         */
        fun createWithConfig(
            context: Context,
            sampleRate: Int,
            audioFormat: String,
            audioSource: Int
        ): SimpleRecordingManager {
            val manager = SimpleRecordingManager(context)
            val customConfig = RecordingConfig.createConfig(sampleRate, audioFormat, audioSource)
            manager.updateConfig(customConfig)
            return manager
        }
        
        /**
         * 快速创建内部音频录制管理器
         */
        fun createForInternalAudio(context: Context): SimpleRecordingManager {
            return createWithConfig(
                context,
                RecordingConfig.DEFAULT_SAMPLE_RATE,
                RecordingConfig.DEFAULT_AUDIO_FORMAT,
                RecordingConfig.getDefaultAudioSource()
            )
        }
        
        /**
         * 快速创建麦克风录制管理器
         */
        fun createForMicrophone(context: Context): SimpleRecordingManager {
            return createWithConfig(
                context,
                RecordingConfig.DEFAULT_SAMPLE_RATE,
                RecordingConfig.DEFAULT_AUDIO_FORMAT,
                RecordingConfig.DEFAULT_AUDIO_SOURCE_MIC
            )
        }
    }
}